﻿#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <windows.h>
#include <locale.h>
#include <time.h>
#include <assert.h>

#define WALL L'□'
#define FOOD L'★'
#define SNAKE L'●'
#define SNAKEHEAD L'※'

#define COLINIT 24
#define ROWINIT 5

#define UPMAX 1
#define DOWNMAX 25
#define LEFTMAX 2
#define RIGHTMAX 54


#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

enum DIRECTION
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
};

enum STATUS
{
	OK,
	KILL_BY_WALL,
	KILL_BY_SELF,
	END_ES
};

typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;


typedef struct Snake
{
	pSnakeNode _pSnake;//蛇头结点
	pSnakeNode _Food;//食物结点
	enum DIRECTION _Dir;//方向
	enum STATUS _Sta;//状态
	int _FoodWeight;//食物加分
	int _Socre;//总分
	int _SleepTime;//速度

}Snake, * pSnake;

//游戏初始化
void GameInit(pSnake ps);

//游戏运行
void GameRun(pSnake ps);

//游戏结束
void GameEnd(pSnake ps);

//设置光标位置
void SetPos(int x, int y);

//欢迎界面
void WelcomeScreen();

//活动范围设置
void Range();

//帮助信息
void HelpMessage();

//初始化蛇身
void InitSnake(pSnake ps);

//食物创建
void CreateFood(pSnake ps);

//暂停游戏
void SPACETIME();

//蛇移动与食物刷新
void SnakeMove(pSnake ps);

//吃食物
void EatFood(pSnake ps);

//没有食物
void NotFood(pSnake ps);

//判断是否死亡
void Kill(pSnake ps);